iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

零基礎成為 AI 解夢大師秘笈系列 第 13

【零基礎成為 AI 解夢大師秘笈】Day13 - 前端 II

  • 分享至 

  • xImage
  •  

斜槓學習 – 零基礎成為 AI 解夢大師秘笈

前言

系列文章簡介

大家好,我們是 AI . FREE Team - 人工智慧自由團隊,這一次的鐵人賽,自由團隊將從0到1 手把手教各位讀者學會 (1)Python基礎語法 (2)Python Web 網頁開發框架 – Django (3)Python網頁爬蟲 – 周易解夢網 (4)Tensorflow AI語言模型基礎與訓練 – LSTM (5)實際部屬AI解夢模型到Web框架上。

為什麼技術要從零開始寫起

自由團隊的成立宗旨為開發AI/新科技的學習資源,提供各領域的學習者能夠跨域學習資料科學,並透過自主學習發展協槓職涯,結合智能應用到各式領域,無論是文、法、商、管、醫領域的朋友,都可以自由的學習AI技術。

資源

AI . FREE Team 讀者專屬福利 → Python Basics 免費學習資源

今日目標

  • 引入 JQuery
  • 使用 AJAX 完成學派的建立

1. 引入 JQuery

JQuery 是在開發 JavaScript 時常會使用到的方法,原本是在純 JavaScript 需要花一些時間撰寫的內容,在使用 JQuery 之後,就會變得相當方便,今天引入 JQuery 之後,就會去改寫昨天有寫到的部分程式碼,大家那個時候就可以感受看看了。

在 Google 上搜尋 JQuery CDN,應該馬上就能找到這個網頁(jQuery CSN),接著我們直接點選最新版本(jQuery Core 3.5.1 uncompressed),應該會看到如下畫面:

我們將內容複製起來,並貼在昨天花了很多心思的 index.html 原有的<script>上方。放在上方是因為我們希望可以先 load 進 JQuery 的 Library 再去跑我們自己寫的 main.js。

    ...
        </div>
        <script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
        <script type="text/javascript" src="/static/main.js"></script>
    </body>
</html>

如此一來,我們就能在 .js 檔內大方地使用 JQuery 幫我們寫好的方法了。接下來的內容都會需要我們先 run server,所以到與 manage.py 同個目錄的地方,執行

python manage.py runserver

2. 改寫原有 main.js

打開 frontend/static/main.js,我們將要對其做編輯。在這邊會將昨天撰寫的程式碼註解掉,一方面算是把努力的紀錄留下,另一方面是大家可以在開發過程中比較純粹使用JavaScript的寫法和伴隨JQuery的寫法之間的差別。

/*
var button = document.getElementById("abutton");

button.addEventListener("click", function(){
    alert("This is what will happen after clicking!")
})

var button2 =  document.getElementById("show_school_btn");

button2.addEventListener("click", function(){
    window.location.href="http://127.0.0.1:8000/demo_app/school_list";
})
*/
$(function(){
    $("#abutton").on("click", function(){
        alert("JQuery Ver. This is what will happen after clicking!")
    });

    $("#show_school_btn").on("click", function(){
        window.location.href="http://127.0.0.1:8000/demo_app/school_list";
    })
});

上面的程式碼中,位在/* ... */ 中的內容就是被註解掉的程式碼,JavaScript看到程式碼被註解就不會去執行它了。好,有了 JQuery 之後,大家可以注意到,原本要利用 getElementById() 才能取得 Web Element,現在只要利用 $("#target_id")就可以輕易取得。

首先,最外層的$(function(){...})代表的是等待 Document (也就是 index.html)都已經載入完成之後,才會開始讓裡面的 code 運作。其完整寫法是$(document).ready(function(){...}),在這裡我們使用到其簡便的寫法。

接著,我們來仔細的看$(function(){...})內部的程式碼,也就是:

    $("#target_id").on("click", function(){
        window.location.href="http://127.0.0.1:8000/demo_app/school_list";
    })

大家已經了解取得 target_id 的方式了,而在其後,我們馬上看到一個on("click", function(){...}),這邊的 on表示監聽的行為,而它會監聽的事件是click 事件,後面的 function 描述了click事件被觸發之後會做的事情。

大致上是這樣,大家有沒有覺得 JQuery 相當方便好用呢?

3 介紹 AJAX

AJAX 的全名是:Asynchronous JavaScript and XML(中文翻譯是:非同步JavaScript和XML),它相較於傳統方式,查詢的速度是相對較快的,詳情可以點擊此以了解更多。前端工程師常會使用 AJAX 的技巧去 Request 伺服器提供的 API,然後再讓網頁進行呈現。我們在今天會使用到的是 AJAX 的 GET 與 POST,在GET當中,雖然不會進行到前端網頁的呈現,但是我們會做到於 console 中顯示回傳的資料內容;而在 POST,我們則會利用昨天建立的 form 去建立一個新的學派。

另外,大家還記得我們自己有開發一些API嗎? 我們現在準備就要對自己寫的API利用AJAX發出 Request了! 如果有忘記自己曾經開發過的API有哪些的話,可以到 http://127.0.0.1:8000/demo_app/ ,我們當初有做一個 API Overview,見下圖。
https://ithelp.ithome.com.tw/upload/images/20200927/20130712KyyCC6l1fp.png

4 利用 AJAX GET

好的,我們繼續編輯 frontend/static/main.js,將 AJAX 的部分加到原本的 button 監聽下方,

$(function(){
    $("#abutton").on("click", function(){
        alert("JQuery Ver. This is what will happen after clicking!")
    });

    $("#show_school_btn").on("click", function(){
        window.location.href="http://127.0.0.1:8000/demo_app/school_list";
    })

    // AJAX PART
    $.ajax({
        type: "GET",
        url:"http://127.0.0.1:8000/demo_app/school_list",
        success: function(data){
            console.log("success", data);
        }
    });
});

注意到我們每次只要使用到 $字符 就表示我們在使用 JQuery 內已經定義好的方法。以下一一介紹在 $.ajax(){} 裡面的內容:

  • type: 這邊表示我們希望發出什麼形式的 Request (GET or POST)
  • url: 在這邊提供API的路徑,所以一路走來的夥伴就可以直接利用我們在前幾天開發的 school_list API了
  • success: 描述在成功 Request 該 API之後,做什麼事情。
  • 在這邊使用到 console.log(),大家可以在http://127.0.0.1:8000/ 透過 Ctrl+Shift+I,看到以下畫面
    https://ithelp.ithome.com.tw/upload/images/20200927/20130712BMcGqhUHxn.png

上面提及的 console.log() 就會把訊息貼在右側console的頁籤底下,如果已經將 AJAX GET的程式碼加入,並且也有把server run起來了,那麼大家應該就都有看到目前的 console 裡面確實有看到幾個學派的資料。通常當前端開發人員在得到這樣子的資料之後,就會再將這些資料漂亮的 render(渲染) 在前端網頁上。

5 利用 AJAX POST

完成 GET 之後,相信大家對於 $.ajax() 的結構已經有初步的認識了,接著,我們往今日的第二個目標前進,利用 AJAX POST 建立起一個新的學派。繼續編輯 frontend/static/main.js 並將下方程式內容(//AJAX POST)加入。

$(function(){
    ...
    // AJAX PART
    $.ajax({
        type: "GET",
        ...
        }
    });

    // AJAX POST
    $("#submit_button").on("click", function(){
        $.ajax({
            type: "POST",
            url: "http://127.0.0.1:8000/demo_app/school_create",
            data: {
                "school_name": $("#exampleSchoolName").val(),
                "core_value": $("#exampleCoreValue").val(),
                "num_member": $("#exampleNumMember").val()
            },
            success: function(){
                console.log("success")
            },
            error: function(){
                console.log("error")
            }
        });
    })
});

在做 AJAX POST 這邊一樣一開始是透過 JQuery 找到該網頁元素(id是submit_button的按鈕),大家可以和 index.html 裡面的內容比對看看,然後再利用on監聽click事件。

而 POST 這邊的設定和 GET 類似,但是多了 data 這個選項,此 data 描述的是一個 JSON 的資料格式,而內容相信走到現在的大家都不會感到陌生了,也就是在設計 model 時就已經決定的 school_name, core_value, num_member。另外,像是 $("#exampleSchoolName").val() 就是利用 JQuery 去取得文字欄位裡面的值。

最後和 GET 一樣,會去設定 success 之後會做的動作,這邊比較不一樣的是,除了 success 之外,還有多了設定 error 的內容,畢竟在 request server 之後不一定每次都會成功,所以在這裡也可以多加上若是error的話,那要做什麼事情。

編輯完 main.js 之後就可以回到 http://127.0.0.1:8000/ 嘗試去做建立學派的動作了。在這邊,請大家同步利用 ctrl+shift+I 將 cosole 打開,然後選擇 Network 頁籤,接著還要勾選 Preserve log

都準備完成之後,就可以在文字欄位處依序輸入 school_name, core_value, num_member(這邊我是分別輸入:MyNewSchoolName, Learning happily is always good!, 55),接著按下 submit 按鈕。會失敗。
https://ithelp.ithome.com.tw/upload/images/20200928/20130712k9GBVgxjB3.png

這邊可以發現在 Network 頁籤這邊出現了紅色的訊息,並告知我們,剛才的動作(Request)得到 403 Forbidden 的回應,這是因為我們並沒有讓這個 POST Request 帶有 csrf 的 token,所以才會被禁止。

6 處理 403 Forbidden

我們來參考了 Django 的這篇文章,它說明了我們剛剛發出的 POST Request 其實算是來路不明的一個Request,我們需要讓我們的 POST Request 同時帶有一個 credential,而這邊的 credential 就是 csrf token。所以我們還需要另外去取得 csrf token,很幸運地,Django 官方已經幫我們寫好取得 token 的程式碼了,點進上述連結,並且複製下圖的程式內容。
https://ithelp.ithome.com.tw/upload/images/20200928/20130712WYf8P3WRh7.png

將它貼進我們的 main.js 裡面,然後在POST方法裡面多新增 headers 將 token 帶入,最後就會變成以下這樣:

    // AJAX PART
    $.ajax({
        type: "GET",
        ...
        }
    });

    // AJAX POST
    function getCookie(name) {
        let cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            const cookies = document.cookie.split(';');
            for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim();
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }

    const csrftoken = getCookie('csrftoken');

    $("#submit_button").on("click", function(){
        $.ajax({
            type: "POST",
            headers: {'X-CSRFToken': csrftoken}, // remember add headers
            url: "http://127.0.0.1:8000/demo_app/school_create",
            data: {
                "school_name": $("#exampleSchoolName").val(),
                "core_value": $("#exampleCoreValue").val(),
                "num_member": $("#exampleNumMember").val()
            },
            success: function(data){
                console.log("success")
            },
            error: function(){
                console.log("error")
            }
        });
    })

完成之後 main.js 的編輯之後,基本上就不會再遇到 403 forbidden 的問題了! 我們再回到 http://127.0.0.1:8000/ 試試看。
一樣分別輸入:MyNewSchoolName, Learning happily is always good!, 55,這一次就會成功了。完成之後,我們點擊在 index.html 自己設計的第二個按鈕,大家應該都可以看到自己剛剛新建的學派。
https://ithelp.ithome.com.tw/upload/images/20200928/20130712wuszG6cpFZ.png

7 邁向 AI 解夢大師 - 第十三天

我們今天主要 Focus 在 main.js 的開發,利用了 JQuery 以及 AJAX 做了 GET 與 POST 的 Request。這些內容不僅是網頁開發的基礎,其實在未來開發語言模型機器人的時候我們都會再看到一遍喔。至此,網頁前端的內容大致上就到這邊,明天開始我們會往 Django Chatterbot 前進,看看 Chatterbot 在 Django 當中是如何運作的。若是有興趣的話,可以先到 Chatterbot Documentation 看看喔!

8 參考連結

想更深入認識 AI . FREE Team?

自由團隊 官方網站:https://aifreeblog.herokuapp.com/
自由團隊 Github:https://github.com/AI-FREE-Team/
自由團隊 粉絲專頁:https://www.facebook.com/AI.Free.Team/
自由團隊 IG:https://www.instagram.com/aifreeteam/
自由團隊 Youtube:https://www.youtube.com/channel/UCjw6Kuw3kwM_il39NTBJVTg/

文章同步發布於:自由團隊部落格
(想看更多文章?學習更多AI知識?敬請鎖定自由團隊的頻道!)


上一篇
【零基礎成為 AI 解夢大師秘笈】Day12 - 前端 I
下一篇
【零基礎成為 AI 解夢大師秘笈】Day14 - Django Chatterbot I
系列文
零基礎成為 AI 解夢大師秘笈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言